/* 
 * UnidadeOperacionalInsertUpdateRule.java
 * 
 * Data de criação: 28/09/2010
 * 
 * O2 SOLUTIONS - SOLUÇÕES EM TECNOLOGIA DA INFORMAÇÃO. 
 *
 */
package br.com.o2solutions.siso.business.rule.unidade.operacional;

import java.util.List;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import br.com.o2solutions.core.exception.BusinessException;
import br.com.o2solutions.core.integration.repository.DataBaseIntegration;
import br.com.o2solutions.core.service.rule.Rule;
import br.com.o2solutions.siso.integration.entidade.UnidadeOperacional;
import br.com.o2solutions.util.assertion.Assert;

/**
 * Classe responsável por realizar a validação de Atualização ou Inserção do
 * objeto de domínio {@link UnidadeOperacional}.
 * 
 * @author osvaldeir
 * @since 28/09/2010
 * 
 */
@Component("unidadeOperacionalInsertUpdateRule")
public class UnidadeOperacionalInsertUpdateRule implements
		Rule<UnidadeOperacional> {

	@Value("#{unidadeOperacionalDAO}")
	private DataBaseIntegration<UnidadeOperacional> unidadeOperacionalDAO;

	/**
	 * {@inheritDoc}
	 * <p>
	 * O cadastro de Unidades Operacionais com a mesma descrição é considerado
	 * uma quebra negocial, assim, é lançada uma {@link BusinessException} com a
	 * chave <b>error.unidade.operacional.existis</b> informando a existência da
	 * Unidade Operacional na base de dados. É verificado também se o campo
	 * obrigatório <b>descricao</b> é diferente de vazio e não nulo.
	 * </p>
	 */
	@Override
	public void check(UnidadeOperacional entity) throws BusinessException {
		Assert.hasText(entity.getDescricao(), new BusinessException(
				"O campo descricao da Unidade Operacional é obrigatório",
				"error.required.field", entity.getDescricao()));
		List<UnidadeOperacional> resultList = unidadeOperacionalDAO
				.findByNamedQuery("UnidadeOperacional.findByDescricao",
						entity.getDescricao());
		resultList.remove(entity);
		Assert.isEmpty(resultList, new BusinessException(
				"Unidade Operacional já cadastrada com a descrição Informada",
				"error.unidade.operacional.existis", entity.getDescricao()));
	}

}
